/**
 * @author 艾尼亚尔
 * @date 2025/8/18
 * @description
 */

import axios from 'axios';
import type {AxiosRequestConfig, Canceler} from 'axios';


// 声明一个 Map 用于存储每个请求的标识 和 取消函数
const PENDING_MAP = new Map<string, Canceler>();

export const getPendingUrl = (config?: AxiosRequestConfig) => {
    if (!config) return '';
    // 把 chunkIndex 放到 header 里传进来
    const idx = config.headers?.['x-chunk-index'] ?? '';
    return `${config.method?.toUpperCase()}&${config.url}&${idx}`;
}

export class AxiosCanceler {
    /**
     * 添加请求
     * @param {Object} config
     */
    addPending(config: AxiosRequestConfig) {
        const url = getPendingUrl(config);
        if (!url) return;
        this.removePending(config);
        config.cancelToken =
            config.cancelToken ||
            new axios.CancelToken((cancel) => {
                if (!PENDING_MAP.has(url)) {
                    // 如果 pending 中不存在当前请求，则添加进去
                    PENDING_MAP.set(url, cancel);
                }
            });
    }

    /**
     * 移除请求
     * @param {Object} config
     */
    removePending(config: AxiosRequestConfig) {
        const url = getPendingUrl(config);
        if (!url) return;
        if (PENDING_MAP.has(url)) {
            // 如果在 pending 中存在当前请求标识，需要取消当前请求，并且移除
            const cancel = PENDING_MAP.get(url);
            if (cancel) {
                cancel(url);
            }
            PENDING_MAP.delete(url);
        }
    }

    /**
     * @description: 清空所有pending
     */
    removeAllPending() {
        PENDING_MAP.forEach((cancel) => cancel());
        PENDING_MAP.clear();
    }

    /**
     * @description: 重置
     */
    reset(): void {
        PENDING_MAP.clear();
    }
}
